package com.xcrj.java8.funcref;

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

/**
 * 方法引用，双冒号::，使得代码更加紧凑，不用重复写lambda表达式
 * xcrj 有函数式接口才能使用lambda，有lambda才能使用方法引用
 * xcrj 引用其他方法代替自己写lambda表达式
 * 类名::静态方法
 * 对象::成员方法
 * 类::new
 */
public class Test1 {
    public static void main(String[] args) {
        test1();
        System.out.println("==========");

        test3();
        System.out.println("==========");

        // 需要写lambda表达式
        GreetFunc greetFunc=()->{System.out.println("clzSayHi");};
        test2(greetFunc);
        // xcrj 类名::静态方法 直接使用已有的静态方法作lambda表达式
        test2(HiHi::clzSayHi);
        System.out.println("==========");

        // xcrj 对象::成员方法
        GreetFunc greetFunc1=()->{System.out.println("objSayHi");};
        test2(greetFunc1);
        HiHi hiHi=new HiHi();
        test2(hiHi::objSayHi);
        System.out.println("==========");

        // xcrj 类::new 构造方法
        GreetFunc greetFunc2=()->new HiHi();
        test2(greetFunc2);
        test2(HiHi::new);
    }

    public static void test1() {
        List<String> list=new ArrayList<>();
        list.add("python");
        list.add("java");
        list.add("golang");
        list.add("c++");

        list.forEach(str->System.out.println(str));
        list.forEach(System.out::println);
    }

    // greetFunc 方法接口
    public static void test2(GreetFunc greetFunc) {
        greetFunc.hello();
    }

    public static void test3(){
        String[] strs=new String[]{"python","java","golang","c++"};
        Arrays.sort(strs,(a,b)->{return a.compareToIgnoreCase(b);});
        Arrays.sort(strs,(a,b)->a.compareToIgnoreCase(b));
        Arrays.sort(strs,String::compareToIgnoreCase);
    }
}
